# Copyright 2019 Google LLC
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

# NOTE: This file is auto generated by the elixir code generator program.
# Do not edit this file manually.

defmodule GoogleApi.BackupDR.V1.Model.StandardSchedule do
  @moduledoc """
  `StandardSchedule` defines a schedule that run within the confines of a defined window of days. We can define recurrence type for schedule as HOURLY, DAILY, WEEKLY, MONTHLY or YEARLY.

  ## Attributes

  *   `backupWindow` (*type:* `GoogleApi.BackupDR.V1.Model.BackupWindow.t`, *default:* `nil`) - Required. A BackupWindow defines the window of day during which backup jobs will run. Jobs are queued at the beginning of the window and will be marked as `NOT_RUN` if they do not start by the end of the window. Note: running jobs will not be cancelled at the end of the window.
  *   `daysOfMonth` (*type:* `list(integer())`, *default:* `nil`) - Optional. Specifies days of months like 1, 5, or 14 on which jobs will run. Values for `days_of_month` are only applicable for `recurrence_type`, `MONTHLY` and `YEARLY`. A validation error will occur if other values are supplied.
  *   `daysOfWeek` (*type:* `list(String.t)`, *default:* `nil`) - Optional. Specifies days of week like, MONDAY or TUESDAY, on which jobs will run. This is required for `recurrence_type`, `WEEKLY` and is not applicable otherwise. A validation error will occur if a value is supplied and `recurrence_type` is not `WEEKLY`.
  *   `hourlyFrequency` (*type:* `integer()`, *default:* `nil`) - Optional. Specifies frequency for hourly backups. A hourly frequency of 2 means jobs will run every 2 hours from start time till end time defined. This is required for `recurrence_type`, `HOURLY` and is not applicable otherwise. A validation error will occur if a value is supplied and `recurrence_type` is not `HOURLY`. Value of hourly frequency should be between 6 and 23. Reason for limit : We found that there is bandwidth limitation of 3GB/S for GMI while taking a backup and 5GB/S while doing a restore. Given the amount of parallel backups and restore we are targeting, this will potentially take the backup time to mins and hours (in worst case scenario).
  *   `months` (*type:* `list(String.t)`, *default:* `nil`) - Optional. Specifies the months of year, like `FEBRUARY` and/or `MAY`, on which jobs will run. This field is only applicable when `recurrence_type` is `YEARLY`. A validation error will occur if other values are supplied.
  *   `recurrenceType` (*type:* `String.t`, *default:* `nil`) - Required. Specifies the `RecurrenceType` for the schedule.
  *   `timeZone` (*type:* `String.t`, *default:* `nil`) - Required. The time zone to be used when interpreting the schedule. The value of this field must be a time zone name from the IANA tz database. See https://en.wikipedia.org/wiki/List_of_tz_database_time_zones for the list of valid timezone names. For e.g., Europe/Paris.
  *   `weekDayOfMonth` (*type:* `GoogleApi.BackupDR.V1.Model.WeekDayOfMonth.t`, *default:* `nil`) - Optional. Specifies a week day of the month like, FIRST SUNDAY or LAST MONDAY, on which jobs will run. This will be specified by two fields in `WeekDayOfMonth`, one for the day, e.g. `MONDAY`, and one for the week, e.g. `LAST`. This field is only applicable for `recurrence_type`, `MONTHLY` and `YEARLY`. A validation error will occur if other values are supplied.
  """

  use GoogleApi.Gax.ModelBase

  @type t :: %__MODULE__{
          :backupWindow => GoogleApi.BackupDR.V1.Model.BackupWindow.t() | nil,
          :daysOfMonth => list(integer()) | nil,
          :daysOfWeek => list(String.t()) | nil,
          :hourlyFrequency => integer() | nil,
          :months => list(String.t()) | nil,
          :recurrenceType => String.t() | nil,
          :timeZone => String.t() | nil,
          :weekDayOfMonth => GoogleApi.BackupDR.V1.Model.WeekDayOfMonth.t() | nil
        }

  field(:backupWindow, as: GoogleApi.BackupDR.V1.Model.BackupWindow)
  field(:daysOfMonth, type: :list)
  field(:daysOfWeek, type: :list)
  field(:hourlyFrequency)
  field(:months, type: :list)
  field(:recurrenceType)
  field(:timeZone)
  field(:weekDayOfMonth, as: GoogleApi.BackupDR.V1.Model.WeekDayOfMonth)
end

defimpl Poison.Decoder, for: GoogleApi.BackupDR.V1.Model.StandardSchedule do
  def decode(value, options) do
    GoogleApi.BackupDR.V1.Model.StandardSchedule.decode(value, options)
  end
end

defimpl Poison.Encoder, for: GoogleApi.BackupDR.V1.Model.StandardSchedule do
  def encode(value, options) do
    GoogleApi.Gax.ModelBase.encode(value, options)
  end
end
